home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
fish
/
001-100
/
076-100
/
091
/
adlcomp
/
codegen.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-18
|
2KB
|
123 lines
/***************************************************************\
* *
* codegen.c - routines to generate appropriate ADL *
* stack machine instructions. *
* Copyright 1987 by Ross Cunniff. *
* *
\***************************************************************/
#include <stdio.h>
#include "adltypes.h"
#include "virtmem.h"
#include "adldef.h"
address
numcode = 1; /* Number of bytes of code written */
extern struct pagetab
codetab; /* Code paging table. */
/***************************************************************\
* *
* oldcode( addr, opcode, opnd ) - Emits instruction *
* opcode opnd at address addr. Compresses the instr. *
* if possible. *
* *
\***************************************************************/
address
oldcode( addr, opcode, opnd )
address
addr;
int16
opnd;
char
opcode;
{
int16
num;
switch( opcode ) {
case PUSH :
if( (opnd >= -127) && (opnd <= 0) ) {
opcode = PUSHN | (char)(opnd & 0x07F);
num = 1;
}
else if( (opnd >= -1024) && (opnd <= 1023) ) {
opcode = PUSHS | (char)((opnd >> 8) & 0x03F);
opnd &= 0x0FF;
num = 2;
}
else
num = 3;
break;
case PUSHARG :
case PUSHLOCL :
case CALL :
opcode |= (char)(opnd & 0x01F);
case NOP :
case POP :
case PUSHME :
case RET :
num = 1;
break;
case JMP :
case JMPZ :
case FILEN :
case LINEN :
num = 3;
break;
}
vm_put8( opcode, (int32)(addr++), &codetab );
switch( num ) {
case 1 :
break;
case 2 :
vm_put8( (char)(opnd & 0x0ff), (int32)addr, &codetab );
break;
case 3 :
vm_put16( (int16)(opnd & 0x0ffff), (int32)addr, &codetab );
break;
}
return (address)num;
}
/***************************************************************\
* *
* newcode( opcode, opnd ) - emit instruction opcode opnd *
* at the current address in the code file. *
* *
\***************************************************************/
address
newcode( opcode, opnd )
char
opcode;
int16
opnd;
{
address
nc_save;
nc_save = numcode;
numcode += oldcode( numcode, opcode, opnd );
return nc_save;
}
/***************************************************************\
* *
* currcode() - returns the current code address. *
* *
\***************************************************************/
address
currcode()
{
return numcode;
}
/*** EOF codegen.c ***/